跳到主要内容

RAG 专题

问题:简述下RAG是什么

RAG 就是检索增强生成,为了解决大模型对未训练数据的知识缺失问题而生 一般叫做知识截止,模型在没有依据时也会尝试生成,就会产生幻觉

所以需要 RAG 把缺失的这些知识补给大模型

问题:主要流程是什么

粗分有 索引阶段、检索阶段、生成阶段

索引就是把知识整理起来供查询使用

检索就是 把索引的知识查出来

生成就是把检索知识放到 prompt 里让大模型生成答案

再细分:索引包括 数据清洗、文档切割、向量化、存入向量库

检索包括:用户问题处理,例如向量化、查询改写等;然后检索,检索可以向量检索、关键字(BM25)、混合检索、多路检索与结果融合(RRF)、知识图谱检索;也可以假设文档嵌入,让模型先构造可能的答案

最基本的是向量检索,一般也会加上BM25

然后是重排序(Rerank),这是一种优化,从 top-K 中提取最相似的文档

最后就是生成,把找到的文档给模型,让模型生成答案

问题:每个流程的标准优化

索引阶段: 数据清洗有优化空间、例如版面识别、OCR等,图文混合怎么保留结构等

文档分割阶段: 有多种切割策略:固定长度、递归字符、语义分块、滑动窗口、文档结构等,可以根据文档结构来选,如法律条文直接文档结构 对于 chunk_size 和 chunk_overlap 的选择,一般尽量让一个chunk包含一个完整的命题,overlap 10-20%

我们还用了父子chunk 的策略

向量化 就根据情况选 embedding 模型

如果是多语言文本,最好选多语言模型,因为单语言模型对不同语言相同语义映射不到一个空间

维度选择,纬度越高语义特征越丰富,但存储和检索的成本越高 视你的文本语义丰富度来选 384 ~ 1024 即可

然后就是向量库 这个我研究不多,一般用 Milvus,还有用 pg 的,主要看运维成本和数据量吧

检索阶段 多种检索一起上:向量、关键字 检索还可以改写query或构造答案,以获取更多可能的文档 还可以加入知识图谱,找有关系的实体

然后rerank RRF、corss-encoder

然后就是构造propmt,调大模型 最原始的就调一次,但如果优化这个过程,改为一个agent,让模型自己决策,优化空间很大,但速度慢的多,现在有自反思、纠正 等策略,agrntic RAG

问题:评估方式

一般有以下几个指标

检索的指标 召回率、精确率

生成的指标 忠实度 相关性 答案正确性

问题:幻觉怎么解决

两种幻觉 检索到了,但生成结果矛盾 没检索到,生成幻觉

最简单就是提示词约束,要求不要瞎编

然后就是强制要求引用

再调一次大模型来输出自校验

问题:知识库更新怎么做

新增的文档直接加到库里

修改就根据 doc_id 删除向量再插入

知识库效果不佳怎么排查

先检查每个节点,判断哪个节点出了问题 再针对问题优化